package org.acim.manager
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	
	import org.acim.resource.ResInfo;
	import org.acim.resource.ResLoader;

	/**
	 * 资源管理器：资源加载，资源缓存
	 * @author Tide
	 */
	public class ResourceManager
	{
		/**
		 * 资源加载错误
		 */
		public static const RESOURCE_ERROR:String = "resourceError";
		
		/**
		 * 资源加载后导出错误
		 */
		public static const RESOURCE_REFLECT_ERROR:String = "resourceReflectError";
		
		/**
		 * 最高优先权，不等待任何加载项，立即启动加载，如果有正在加载的将被关闭
		 */
		public static const HIGHEST:int = 0;
		
		/**
		 * 高于标准，排在标准前面
		 */
		public static const HIGH:int = 1;
		
		/**
		 * 标准
		 */
		public static const STRANDARD:int = 2;
		
		/**
		 * 优先权比较低，等待所有标准以上的不在缓存中就补上去
		 */
		public static const LOW:int = 3;
		
		/**
		 * 优先级最低，正在加载项为空的时候进行加载；出现非空闲状态，该项将被中断加载
		 */
		public static const LOWEST:int = 4;
		
		//
		
		/**
		 * 并行加载最大数目
		 */
		public static var maxLpt:uint = 2;
		
		/**
		 * 最大缓存数
		 */
		public static var macCache:uint = 300;
		
		/**
		 * 需要加载的资源列表，内容类型：ResInfo
		 */
		private static var _dataList:Array = [];
		
		/**
		 * 加载器列表，内容类型：ResLoader
		 */
		private static var _loaderList:Array = [];
		
		/**
		 * 缓存列表，内容类型：{url:String,res:Class或BitmapData}
		 */
		private static var _cacheList:Array = [];
		
		private static var _cacheMultiList:Array = [];
		
		private static var _isStop:Boolean = false;
		
		//---------------------------------------------------------------
		// public function
		//---------------------------------------------------------------
		
		/**
		 * 从指定的URL中获取资源
		 * @param url 路径
		 * @param event event(content:DisplayObject)
		 * @param name 默认""获取整个swf类
		 * @param level 加载优先级别
		 * @param isCache 是否缓存
		 */
		public static function getResource(url:String, event:Function, name:String="item", level:int = 3, isCache:Boolean = true):void
		{
			//获取缓存中的资源类
			if(_cacheList.length > 0)
			{
				for each(var obj:Object in _cacheList)
				{
					if(obj.url == url)
					{
						if(obj.res is BitmapData)
						{
							event(new Bitmap(obj.res as BitmapData));
						}
						else
						{
							event(new obj.res());
						}
						return;
					}
				}
			}
			
			//添加加载信息
			var isHas:Boolean = _dataList.some(function(item:ResInfo,index:int,array:Array):Boolean
			{
				if(item.url == url)
				{
					item.eventList.push(event);
					return true;
				}
				return false;
			});
			
			if(!isHas)
			{
				var resInfo:ResInfo = new ResInfo();
				resInfo.eventList.push(event);
				resInfo.isCache = isCache;
				resInfo.level = level;
				resInfo.url = url;
				resInfo.name = name;
				_dataList.push(resInfo);
				_dataList.sortOn("level",Array.NUMERIC);
					
				//获取空闲的加载器
				var resLoader:ResLoader = getEmptyLoader(level);
				if(resLoader)
				{
					resLoader.load(resInfo);
				}
			}
		}
		
		public static function getResourceList(url:String, event:Function, nameList:Array, level:int = 3, isCache:Boolean = true):void
		{
			//获取缓存中的资源类
			if(_cacheMultiList.length > 0)
			{
				var outArr:Array = [];
				for each(var obj:Object in _cacheMultiList)
				{
					if(obj.url == url)
					{
						
					}
				}
			}
		}
		
		//---------------------------------------------------------------
		// private function
		//---------------------------------------------------------------
		
		private static function getEmptyLoader(level:int=3):ResLoader
		{
			var resLoader:ResLoader;
			return resLoader;
		}
	}
}